package br.com.sgh.beans;

import br.com.sgh.dao.EmprestimoDAO;
import br.com.sgh.dao.FuncionarioDAO;
import br.com.sgh.entidade.Emprestimo;
import br.com.sgh.entidade.Funcionario;
import br.com.sgh.suport.ComparaObjetos;
import br.com.sgh.suport.TitulosMaisEmprestado;
import br.com.sgh.util.FacesContextUtil;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

@ManagedBean
@RequestScoped
public class RankingFuncionario implements Serializable {

    private StreamedContent arquivoRetorno;
    private List<Funcionario> funcionarios;
    private List<Emprestimo> emprestimos;
    private List<TitulosMaisEmprestado> rankingFuncionarios = new ArrayList<TitulosMaisEmprestado>();

    private FuncionarioDAO funcionarioDao() {
        FuncionarioDAO<Funcionario> dao = new FuncionarioDAO<Funcionario>(Funcionario.class, FacesContextUtil.getRequestSession());
        return dao;
    }

    private EmprestimoDAO emprestimoDao() {
        EmprestimoDAO<Emprestimo> dao = new EmprestimoDAO<Emprestimo>(Emprestimo.class, FacesContextUtil.getRequestSession());
        return dao;
    }

    @PostConstruct
    public void rankingDosFuncionarios() {
        int total;
        funcionarios = funcionarioDao().getEntitys();
        for (Funcionario f : funcionarios) {
            emprestimos = emprestimoDao().listarRankingFuncionarios(f.getCodFuncionario());
            total = 0;
            for (Emprestimo e : emprestimos) {
                total++;
            }

            if (total > 0) {
                TitulosMaisEmprestado titulosMaisEmprestado = new TitulosMaisEmprestado();
                titulosMaisEmprestado.setTitulo(f.getNome());
                titulosMaisEmprestado.setQtde(total);

                //System.out.println("Titulo : " + titulosMaisEmprestado.getTitulo() + " Total Emprestimo : " + titulosMaisEmprestado.getQtde());
                rankingFuncionarios.add(titulosMaisEmprestado);
            }
        }
        ComparaObjetos ob = new ComparaObjetos();
        Collections.sort(rankingFuncionarios, ob);
    }

    public StreamedContent getArquivoRetorno() throws DocumentException, FileNotFoundException, IOException {
        System.err.println("Entro no metodo");
        Document document = new Document(PageSize.A4);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PdfWriter.getInstance(document, baos);
        document.open();

        Font f = new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD);
        Paragraph t1 = new Paragraph("SGBC - BIBLIOTECA CORPORATIVA", f);
        t1.setAlignment(Element.ALIGN_CENTER);
        document.add(t1);

        Paragraph t2 = new Paragraph("SORRISO - MT", f);
        t2.setAlignment(Element.ALIGN_CENTER);
        document.add(t2);

        Paragraph p = new Paragraph("Ranking dos Funcionários que mais emprestaram livros");
        p.setAlignment(Element.ALIGN_CENTER);
        document.add(p);
        try {

            Font fc = new Font(Font.FontFamily.TIMES_ROMAN, 8);
            Font fh = new Font(Font.FontFamily.TIMES_ROMAN, 8, Font.BOLD);

            if (rankingFuncionarios.size() > 0) {

                PdfPTable table = new PdfPTable(new float[]{0.01f, 0.07f, 0.02f});

                table.setSpacingBefore(5.0f);
                table.setWidthPercentage(100.0f);

                table.setHorizontalAlignment(Element.ALIGN_LEFT);

                table.addCell(new Phrase("Ranking", fh));
                table.addCell(new Phrase("Funcionário", fh));
                table.addCell(new Phrase("Qtde", fh));

                int ranking = 1;
                for (TitulosMaisEmprestado e : rankingFuncionarios) {
                    table.addCell(new Phrase(String.valueOf(ranking) + "º", fc));
                    table.addCell(new Phrase(e.getTitulo(), fc));
                    table.addCell(new Phrase(String.valueOf(e.getQtde()), fc));
                    ranking++;
                }
                document.add(table);

            }
        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao tentar Gerar o Relatório", "Erro"));
        }
        //document.add(table);
        document.close();
        FileOutputStream fos = new FileOutputStream("C:\\PDF\\arqPDFexemplo2.pdf");
        InputStream arquivo = new FileInputStream("C:\\PDF\\arqPDFexemplo2.pdf");
        fos.write(baos.toByteArray());
        fos.close();

        arquivoRetorno = new DefaultStreamedContent(arquivo, "application/pdf", "reltorio.pdf");

        return arquivoRetorno;
    }

    public List<Funcionario> getFuncionarios() {
        return funcionarios;
    }

    public void setFuncionarios(List<Funcionario> funcionarios) {
        this.funcionarios = funcionarios;
    }

    public List<Emprestimo> getEmprestimos() {
        return emprestimos;
    }

    public void setEmprestimos(List<Emprestimo> emprestimos) {
        this.emprestimos = emprestimos;
    }

    public List<TitulosMaisEmprestado> getRankingFuncionarios() {
        return rankingFuncionarios;
    }

    public void setRankingFuncionarios(List<TitulosMaisEmprestado> rankingFuncionarios) {
        this.rankingFuncionarios = rankingFuncionarios;
    }

}
